package com.example.libpro.DBEntity;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * 图书管理系统SQLite数据库助手类
 * 作用：1. 初始化SQLite数据库（首次启动APP时创建）；2. 定义用户表、图书表、借阅记录表的结构并创建；
 * 3. 管理数据库版本（处理版本升级/降级，避免数据丢失）；4. 提供可读写/只读的数据库实例供DAO层调用
 * 关联表：user(用户表)、book(图书表)、borrow_record(借阅记录表)
 * 依赖：安卓SQLiteOpenHelper基类，需传入APP上下文初始化
 */
public class DBHelper extends SQLiteOpenHelper {
    // 数据库常量：数据库名、版本号（版本号递增时触发onUpgrade）
    public static final String DB_NAME = "LibraryManagementSystem.db";
    public static final int DB_VERSION = 1;

    // 表结构SQL常量：用户表（user）- 对应UserEntity
    public static final String CREATE_TABLE_USER = "CREATE TABLE IF NOT EXISTS user (" +
            "user_id INTEGER PRIMARY KEY AUTOINCREMENT," +  // 用户ID（自增主键）
            "account TEXT UNIQUE NOT NULL," +               // 登录账号（唯一，非空）
            "password TEXT NOT NULL," +                     // 登录密码（非空）
            "name TEXT NOT NULL," +                         // 用户姓名（非空）
            "role_id INTEGER NOT NULL," +                   // 角色编号（1=管理员，2=读者，非空）
            "is_deleted INTEGER DEFAULT 0" +                // 逻辑删除标识（0=未删除，1=已删除，默认0）
            ");";

    // 表结构SQL常量：图书表（book）- 对应BookEntity
    public static final String CREATE_TABLE_BOOK = "CREATE TABLE IF NOT EXISTS book (" +
            "book_id INTEGER PRIMARY KEY AUTOINCREMENT," +  // 图书ID（自增主键）
            "book_name TEXT NOT NULL," +                    // 书名（非空）
            "author TEXT NOT NULL," +                       // 作者（非空）
            "category TEXT NOT NULL," +                     // 分类（非空，如"计算机"、"文学"）
            "total_count INTEGER NOT NULL," +               // 总数量（非空，图书馆该图书总册数）
            "current_stock INTEGER NOT NULL," +             // 当前在库数量（非空，可借阅数量）
            "is_deleted INTEGER DEFAULT 0" +                // 逻辑删除标识（0=未删除，1=已删除，默认0）
            ");";

    // 表结构SQL常量：借阅记录表（borrow_record）- 对应BorrowRecordEntity
    public static final String CREATE_TABLE_BORROW_RECORD = "CREATE TABLE IF NOT EXISTS borrow_record (" +
            "borrow_id INTEGER PRIMARY KEY AUTOINCREMENT," +// 借阅ID（自增主键）
            "user_id INTEGER NOT NULL," +                   // 关联用户表的user_id（非空）
            "book_id INTEGER NOT NULL," +                   // 关联图书表的book_id（非空）
            "borrow_time LONG NOT NULL," +                  // 借阅时间（时间戳，毫秒，非空）
            "due_time LONG NOT NULL," +                     // 应还时间（时间戳，毫秒，非空）
            "actual_return_time LONG," +                    // 实际归还时间（时间戳，毫秒，未还时为null）
            "borrow_status INTEGER NOT NULL," +             // 借阅状态（0=未还，1=已还，2=逾期，非空）
            "audit_status INTEGER DEFAULT 0," +             // 审核状态（0=待审核，1=已通过，2=已拒绝，默认0）
            "FOREIGN KEY (user_id) REFERENCES user(user_id)," +  // 外键关联用户表
            "FOREIGN KEY (book_id) REFERENCES book(book_id)"  +  // 外键关联图书表
            ");";

    // 构造方法
    /**
     * DBHelper构造方法
     * @param context 安卓上下文对象（如Activity、ApplicationContext），用于创建数据库实例
     * 功能：调用父类SQLiteOpenHelper构造方法，初始化数据库名、版本号
     */
    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        Log.i("DBHelper", "create");

    }

    // 数据库首次创建时调用（仅执行一次）
    /**
     * 数据库首次创建时执行的初始化逻辑
     * @param db 数据库实例（由系统自动传入，无需手动创建）
     * 功能：执行3张核心表的创建SQL（user、book、borrow_record），搭建数据库基础结构
     * 注意：若表已存在（如版本升级后重新创建），通过"IF NOT EXISTS"避免重复创建报错
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_USER);
        db.execSQL(CREATE_TABLE_BOOK);
        db.execSQL(CREATE_TABLE_BORROW_RECORD);
        // 插入默认管理员账户
        String insertAdmin = "INSERT INTO user (account, password, name, role_id) VALUES ('admin', 'admin', 'admin', 1)";
        db.execSQL(insertAdmin);
    }

    // 数据库版本升级时调用（DB_VERSION递增时触发）
    /**
     * 数据库版本升级逻辑（避免数据丢失）
     * @param db 数据库实例（系统传入）
     * @param oldVersion 旧版本号（升级前的版本）
     * @param newVersion 新版本号（升级后的版本）
     * 功能：1. 处理版本兼容（如新增字段、修改表结构）；2. 示例逻辑为"保留旧表数据+创建新表"（实际项目可优化为数据迁移）
     * 注意：禁止直接删除旧表（会导致数据丢失），需根据业务需求实现增量更新
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 示例：若旧版本<2，新增表字段（需根据实际升级需求修改）
        if (oldVersion < 2) {
            // 如给user表新增"phone"字段：db.execSQL("ALTER TABLE user ADD COLUMN phone TEXT;");
        }
        // 若表结构大幅变更，可先备份数据再重建表（示例逻辑，实际需完善数据迁移）
        db.execSQL("DROP TABLE IF EXISTS user");
        db.execSQL("DROP TABLE IF EXISTS book");
        db.execSQL("DROP TABLE IF EXISTS borrow_record");

        onCreate(db);
    }

    // 数据库版本降级时调用（DB_VERSION递减时触发，通常用于测试环境）
    /**
     * 数据库版本降级逻辑
     * @param db 数据库实例（系统传入）
     * @param oldVersion 旧版本号（降级前的版本）
     * @param newVersion 新版本号（降级后的版本）
     * 功能：默认降级为初始版本，删除旧表并重建（仅用于测试，生产环境禁止降级）
     */
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }

    // 获取可读写数据库实例（供DAO层执行增删改操作）
    /**
     * 获取可读写的数据库实例
     * @return SQLiteDatabase 可读写数据库对象
     * 功能：供DAO层执行INSERT、UPDATE、DELETE等写操作，若数据库未创建则自动触发onCreate
     */
    public SQLiteDatabase getWritableDB() {
        return getWritableDatabase();
    }

    // 获取只读数据库实例（供DAO层执行查询操作）
    /**
     * 获取只读的数据库实例
     * @return SQLiteDatabase 只读数据库对象
     * 功能：供DAO层执行SELECT查询操作，避免写操作锁表，提升查询性能
     */
    public SQLiteDatabase getReadableDB() {
        return getReadableDatabase();
    }
}